package com.sky.task;


import com.sky.constant.MessageConstant;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 自定义定时任务类
 */
@Component
@Slf4j
public class MyTask {
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 定时任务 每隔5秒触发一次
     *//*
    @Scheduled(cron = "0/5 * * * * ?")
    public void executeTask(){
        log.info("定时任务开始执行：{}",new Date());
    }*/

    /**
     * 处理超时订单——15分钟还处于“未支付”状态的订单
     */
    @Scheduled(cron = "0 * * * * ?")// 每分钟执行一次
    public void processTimeoutOrder() {
        log.info("处理超时订单");
        // 1.筛选符合超时条件的订单——15分钟，待付款
        // 待付款
        Integer status = Orders.PENDING_PAYMENT;
        // 下单时间 < 当前时间减15分钟
        LocalDateTime timeoutOrderTime = LocalDateTime.now().plusMinutes(-15);
        log.info("计算的超时时间临界点为：{}", timeoutOrderTime);
        List<Orders> timeoutOrders = orderMapper.getByStatusAndOrderTime(status, timeoutOrderTime);
        // 2. 修改订单状态和取消原因
        timeoutOrders.forEach(o -> {
            // 设置状态为取消
            o.setStatus(Orders.CANCELLED);
            // 填写取消原因
            o.setCancelReason(MessageConstant.ORDER_TIME_OUT_CANCEL_REASON);
            // 设置取消时间
            o.setCancelTime(LocalDateTime.now());
            // 3. 更新数据回数据库
            orderMapper.update(o);
        });
    }


    /**
     * 处理“派送中”的订单——每天1点统一把“派送中”修改为“已完成”
     */
    @Scheduled(cron = "0 0 1 * * ?")// 凌晨一点触发
    // @Scheduled(cron = "0 * * * * ?")// 测试使用。一分钟触发
    public void processDeliveryOrder() {
        log.info("处理“派送中”的订单");
        // 1.筛选“派送中”的订单
        Integer status = Orders.DELIVERY_IN_PROGRESS;
        // 下单时间 < 当前时间减60分钟
        LocalDateTime deliveryOrderTime = LocalDateTime.now().minusMinutes(60);
        log.info("计算的需要处理的派送时间临界点为：{}", deliveryOrderTime);
        List<Orders> deliveryOrders = orderMapper.getByStatusAndOrderTime(status, deliveryOrderTime);
        // 2. 修改订单状态
        deliveryOrders.forEach(o -> {
            // 设置状态为完成
            o.setStatus(Orders.COMPLETED);
            // 设置送达时间
            o.setDeliveryTime(LocalDateTime.now());
            // 3. 更新数据回数据库
            orderMapper.update(o);
        });
    }
}
